package com.dyl.user.client;


import com.dyl.common.R;
import com.dyl.user.config.FooConfiguration;
import com.dyl.user.to.BrandTo;
import feign.Headers;
import feign.RequestLine;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * 使用熔断的步骤：
 * 1、在当前服务的pom.xml文件中添加如下两个依赖：
 *         <dependency>
 *             <groupId>org.springframework.cloud</groupId>
 *             <artifactId>spring-cloud-starter-openfeign</artifactId>
 *         </dependency>
 *         <dependency>
 *             <groupId>org.springframework.cloud</groupId>
 *             <artifactId>spring-cloud-starter-loadbalancer</artifactId>
 *         </dependency>
 *        <dependency>
 *             <groupId>com.alibaba.cloud</groupId>
 *             <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
 *         </dependency>
 * 2、在默认配置文件中添加如下配置，开启sentinel对feign的支持!
 *    feign.sentinel.enabled=true
 */

//熔断处理方案一：
//1. 使用fallback处理熔断，其中注意点：
//1.1 其中的fallback对应类一定要放在spring容器中
//1.2 这个类必须实现当前@FeignClient注解所在的接口
// @FeignClient(value="cloud-manager", fallback = ManagerClientImpl.class)

//熔断处理方案二：
//2. 使用fallbackFactory处理熔断，其中注意点:
//2.1 fallbackFactory的类必须实现FallbackFactory接口，并且这个接口的泛型必须是@FeignClient注解所在的接口
//2.2 fallbackFactory的类也必须放在spring容器中。

@FeignClient(value="cloud-manager",fallbackFactory = ManagerClientFactoryImpl.class)
public interface ManagerClient {

	//1. 调用cloud-manager服务的/brand/list请求
	// @GetMapping(value = "/brand/list",headers = "c1=${c1}")
	// @RequestLine("GET /brand/list")
	// @Headers("Cookie: {Cookie}")
	@GetMapping(value = "/brand/list")
	R findAll(@RequestHeader(name = "Cookie") String c1);

	//2. 查询单个品牌
	//细节：即使参数名与路径变量的名字一样，@PathVariable("id")其中的参数也不能省略
	@GetMapping("/brand/findById/{id}")
	R findById(@PathVariable("id") Long id);

	//3. 保存品牌
	@PostMapping("/brand/add")
	R add(@RequestBody BrandTo brand);
}
